package Game;

import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
import javax.swing.border.LineBorder;
import TDALista.InvalidPositionException;
import TDAMapeo.*;


//falta depositar coleccionables
public class GUI extends javax.swing.JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	protected ClaseArchivo archivo,archivo1;
	protected Keyboard key;
	protected int tamaX,tamaY;
	protected JPanel panel;
	private JFrame Menu,MenuAyuda;
	private JPanel botonClose;
	private JPanel botonStart;
	private JLabel mostrarDatos;
	private JPanel panel1, MostrarAyuda;
	private JPanel panelDatos;
	private Map<String,ImageIcon[]> mapeo;

	private Jugador j;
	private Controlador controlador;
	private Robot myRobot;
	protected Tablero t;
	
	
	private int horizonte;
	private int AnteriorX;
	private int AnteriorY;
	protected Premio llegada;
	private JLabel Puntaje,Combustible, Balas, UltPremio, Premio, Opciones;
	private JButton Cargar, Ayuda, Editor, reiniciarNivel, terminarNivel;
	private JButton Arriba, Abajo, Derecha, Izquierda,Negro,Blanco,Recoger,Descargar,Pincel,Disparar;
	protected Transitable inicio;
	protected boolean esMilitar;
	protected String ruta;
	protected String dato;
	protected JLabel comision;

	
	public GUI() {
		super();
		this.setTitle("Proyecto X 2013 - Enrique,Klein,Kloster");
		ruta = null;
		initGUI();
	}
	
	
	/**
	 * Inicia el panel donde se desaarrolla el juego y sus atributos.
	 */
	
	public void iniciarJuego (Robot r) {
		
			
		horizonte=2; //mira para abajo
		
		
		//System.out.println("leerMapa");
		if (!archivo.leerMapa(t,this))
			{
			JOptionPane.showMessageDialog(null,"El nivel no es correcto","Error", JOptionPane.ERROR_MESSAGE);
		
			}
		
		AnteriorX=myRobot.getPosX();
		AnteriorY=myRobot.getPosY();
		j.setRobot(myRobot);


	}
	

	
	
	private void initGUI2() {
		
		getContentPane().setLayout(null);
		
	
		//Panel que contiene el fondo del juego

		panel= new JPanel();
		panel.setBounds(0,0,900,700);
		panel.setLayout(null);
		panel.setName("arriba de este fondo pasa la accion");
		panel.setEnabled(true);
		panel.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
		getContentPane().add(panel);
		

		
		
		Combustible = new JLabel();
		Combustible.setBounds(0, 50, 100, 70);
		Combustible.setText("Combustible: ");
		
		
		Puntaje= new JLabel();
		Puntaje.setBounds(0, 70, 90, 70);
	
		
		Balas= new JLabel();
		Balas.setBounds(0,90, 70, 70);
	
		
		UltPremio=new JLabel();
		UltPremio.setBounds(0, 120, 90, 70);
		
		Premio= new JLabel();
		Premio.setBounds(0,140,90,70);
		
		Opciones= new JLabel();
        Opciones.setBounds(10,182, 80, 50);
        Opciones.setText("Botonera");
        Opciones.setFont(new java.awt.Font("Tahoma", 07, 16));
        Opciones.setForeground(new java.awt.Color(253, 53, 0));
	
		
		terminarNivel= new JButton();
		terminarNivel.setText("Terminar");
		
		reiniciarNivel= new JButton();
		reiniciarNivel.setText("Reiniciar");
		
		Arriba= new JButton();
		Arriba.setText("Arriba");
		
		Abajo= new JButton();
		Abajo.setText("Abajo");
		
		Derecha= new JButton();
		Derecha.setText("Derecha");
		
		Izquierda = new JButton();
		Izquierda.setText("Izquierda");
		
		Negro = new JButton();
		Negro.setText("Negro");
		
		Blanco = new JButton();
		Blanco.setText("Blanco");
		
		
		Recoger = new JButton();
		Recoger.setText("Recoger");
		
		Descargar = new JButton();
		Descargar.setText("Descargar");
		
		Pincel = new JButton();
		Pincel.setText("Pincel");
		
		Disparar = new JButton();
		Disparar.setText("Disparar");
		
		panelDatos = new JPanel();
		panelDatos.setBounds(900,0 , 100, 500);
		panelDatos.setLayout(null);
		panelDatos.add(reiniciarNivel);
		panelDatos.add(terminarNivel);
		panelDatos.add(Opciones);
		panelDatos.add(Arriba);
		panelDatos.add(Abajo);
		panelDatos.add(Derecha);
		panelDatos.add(Izquierda);
		panelDatos.add(Blanco);
		panelDatos.add(Negro);

		panelDatos.add(Recoger);
		panelDatos.add(Descargar);
		panelDatos.add(Pincel);
		panelDatos.add(Disparar);
		
		panelDatos.add(Combustible);
		panelDatos.add(Puntaje);
		panelDatos.add(Balas);
		panelDatos.add(UltPremio);
		panelDatos.add(Premio);
		
		
		
		reiniciarNivel.setBounds(0,0,95,25);
		terminarNivel.setBounds(00,20,95,25);
		Arriba.setBounds(00, 220,95, 25);
		Abajo.setBounds(00, 245,95, 25);
		Derecha.setBounds(00, 270,95, 25);
		Izquierda.setBounds(00, 295,95, 25);
		Blanco.setBounds(00, 320,95, 25);
		Negro.setBounds(00, 345,95, 25);
		Recoger.setBounds(0,395,95,25);
		Descargar.setBounds(0,420,95,25);
		Pincel.setBounds(0,445,95,25);
		Disparar.setBounds(0,470,95,25);
		
		
		getContentPane().add(panelDatos);
		
		Descargar.addActionListener(new ActionListener(){
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt){
				depositar();
				panel.requestDefaultFocus();
		}});;
		
		Negro.addActionListener(new ActionListener(){
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt){
				botonNegro();
				panel.requestDefaultFocus();
		}});;
		
		Blanco.addActionListener(new ActionListener(){
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt){
				botonBlanco();
				panel.requestDefaultFocus();
		}});;
		
		Pincel.addActionListener(new ActionListener (){
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt){
				if (j.getRobot().getPincel().getActivado())
					j.getRobot().getPincel().setActivado(false);
				else j.getRobot().getPincel().setActivado(true);
				panel.requestDefaultFocus();
			}
		});
		
		
		Arriba.addActionListener(new ActionListener() {
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt) {
				avanzar();
				panel.requestDefaultFocus();

			}});
		
		Abajo.addActionListener(new ActionListener() {	
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt) {
				j.getRobot().getBrazo().actiDesac();
				controlador.actualizar();
				panel.requestDefaultFocus();


			}});
		
		Derecha.addActionListener(new ActionListener() {
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt) {
				girarDer();
				panel.requestDefaultFocus();


			}});
		
		Izquierda.addActionListener(new ActionListener() {
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt) {
				girarIzq();
				panel.requestDefaultFocus();


			}});
		
		Disparar.addActionListener(new ActionListener() {
			@SuppressWarnings("deprecation")

			public void actionPerformed(ActionEvent evt) {
				if (esMilitar)
				{
				
					((Militar)j.getRobot()).disparar(j.getTablero().getDestruibles());
					Balas.setText("Balas: "+((Militar)j.getRobot()).getBalas());
					panel.requestDefaultFocus();

					
				}

			}});
		
		
		
		Recoger.addActionListener(new ActionListener() {
			@SuppressWarnings("deprecation")
			public void actionPerformed(ActionEvent evt) {
				String s;
				// si hay coleccionable lo recolecto
				Coleccionable c = puedeRecolectar();
				

				if (c!=null)
				{
					if (c.esvalisa){s="Baliza";}
					else s= "Cono";
					Premio.setText(" "+ s);
					
					if (!j.getRobot().getBaul().estaLleno())
					
						 
					{
						j.getRobot().getBaul().insertar(c);
						((Transitable)c.getUbicacion()).setColeccionable(null);
						c.getRG().setVisible(false);
						c.getUbicacion().getRG().setVisible(true);
						try {
							j.getTablero().getObjetosColeccionables().remove(c.getPosition());
						} catch (InvalidPositionException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						
					}else System.out.println("baul lleno");
				}
						
			
				panel.requestDefaultFocus();

			}});
		
		
		terminarNivel.addActionListener(new ActionListener() {
			@SuppressWarnings("deprecation")
			public void actionPerformed(ActionEvent evt) {
				 String [] botones = { " Si", "No " };
				int i=JOptionPane.showOptionDialog (null, " ¿Seguro quieres terminar el nivel?", "Terminar nivel", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, botones,null);
				if (i== JOptionPane.YES_OPTION){
								dispose();
								new Juego();}
				if (i== JOptionPane.NO_OPTION){
					panel.requestDefaultFocus();
				}			
			}});
		
		//Hacer el reiniciar niveeeeeeeeeeeel
		reiniciarNivel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				reiniciar();
				panel.requestDefaultFocus();


			}});
	}


	/**
	 * Inicia la primer pantalla
	 */
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		pack();
		//Creacion del mapeo
				mapeo= new OpenHMap<String,ImageIcon[]>();
				
				asignarImagenes();

			
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	

		botonStart = new PanelConFondo("Imagenes/Menu/Start.gif");
		botonStart.setBounds(3, 21, 122, 54);
		Oyente oyente1=new Oyente(this);
		botonStart.addMouseListener(oyente1);
		panel1 = new PanelConFondo("Imagenes/Menu/fondo.png");
		panel1.setBounds(0, 0, 399, 257);
		panel1.setLayout(null);
		panel1.add(botonStart);	
		botonClose = new PanelConFondo("Imagenes/Menu/Exit.gif");
		OyenteClose oyente2=new OyenteClose(this);
		botonClose.addMouseListener(oyente2);
		panel1.add(botonClose);
		botonClose.setBounds(170, 21, 122, 54);
		
		
		if ((ruta==null)||(!archivo.leerMapa(t,this))) dato = "Cargue un nivel";
		
		mostrarDatos = new JLabel(dato);
		mostrarDatos.setBounds(10,90,100,100);


		panel1.add(mostrarDatos);
		
		comision = new JLabel ("Proyecto X 2013: Enrique-Klein-Kloster");
		comision.setBounds(25,120,250,100);
		comision.setFont(new java.awt.Font("Tahoma", 10, 15));

		panel1.add(comision);


		
		Menu = new JFrame();
		Menu.setTitle("Proyecto X 2013");
		Menu.getContentPane().setLayout(null);
		Menu.getContentPane().add(panel1);
		Menu.setSize(305, 215);
		Menu.setVisible(true);
		Menu.setResizable(false);
		Menu.setLocationRelativeTo(null);
	
		this.setSize(1000, 740);
		this.setResizable(false);
		
		
		Cargar = new JButton();
		panel1.add(Cargar);
		Cargar.setText("Cargar nivel");
		Cargar.setBounds(0, 100, 110, 31);
		Cargar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
		
				JFileChooser A = new JFileChooser();
				Integer n= A.showOpenDialog(null);
				if (n!=JFileChooser.CANCEL_OPTION){
					
					
					boolean acepta= A.getSelectedFile().getName().endsWith(".txt");
					if(acepta){
						ruta = A.getSelectedFile().getAbsolutePath();
						archivo= new ClaseArchivo(ruta);
						archivo1= new ClaseArchivo(ruta);
					if((archivo.contarFilas())&&(archivo1.ContarColumnas()))
					{
						initGUI2();

						
						mostrarDatos.setText("Listo para jugar");

						ruta = A.getSelectedFile().getAbsolutePath();
						archivo= new ClaseArchivo(ruta);
						myRobot= new Civil();
						t= new Tablero(myRobot);
						myRobot.setTablero(t);
						
						j = new Jugador (0,t);
						j.setRobot(myRobot);
						iniciarJuego(myRobot);
						key = new Keyboard();
					}
					else {
						ruta=null;
						JOptionPane.showMessageDialog(null,"El tamaño del nivel no es corrercto","Error", JOptionPane.ERROR_MESSAGE);
						
					}


					}else {
						ruta=null;
						JOptionPane.showMessageDialog(null,"No es un archivo de texto","Error", JOptionPane.ERROR_MESSAGE);
					}
				}
			}});
		
		Editor = new JButton();
		panel1.add(Editor);
		Editor.setText("Editar nivel");
		Editor.setBounds(100, 100, 100, 31);
		Editor.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				
				JOptionPane.showMessageDialog( null, "Temporalmente el editor de niveles no esta disponible." );
				
			}});
		
		
		Ayuda = new JButton();
		panel1.add(Ayuda);
		Ayuda.setText("Ayuda");
		Ayuda.setBounds(200, 100, 100, 31);
		Ayuda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				MenuAyuda= new JFrame();
				
				
				MostrarAyuda= new JPanel();
				MostrarAyuda.setBounds(0, 0, 795, 400);
				
				MenuAyuda.getContentPane().setLayout(null);
				MenuAyuda.getContentPane().add(MostrarAyuda);
				MenuAyuda.setSize(799, 403);
				MenuAyuda.setVisible(true);
				MenuAyuda.setResizable(false);
				MenuAyuda.setLocationRelativeTo(null);
				MenuAyuda.setTitle("Ayuda!!");
				
				
				JTextArea textArea = new JTextArea("El juego Linguo 2 consiste en deslizar el robot por el tablero hasta llegar al destino final, " +
						"no sera tan sencillo lograr esto ya que no siempre el robot puede deslizarse por cualquier piso, esto es: Puede caminar sobre asfalto" +
						" y arena pero no lo podra hacer sobre el fuego o agua y ademas puede encontrarse con objetos encima de ella que puede entorpeser el paso." +
						" Al iniciar el juego podemos elegir 2 tipos de robots: El civil o el militar, cada uno" +
						" con diferentes funciones, por ejemplo el primero tiene una capacidad de combustible mayor al otro, pero el robot militar posee balas " +
						"para poder dispararle a los objetos para que no entorpesca el paso. Cada movimiento que hagan cada uno de estos robots se decrementara su combustible, lo mismo ocurrira cuando el militar realice un disparo y" +
						" dejaran una marca por de color negro o blanco marcando su camino." +
						" Durante el juego el jugador se podrÃ¡ encontrar con premios. Cada premio se puede ubicar sobre el piso u oculto dentro de un objeto destruible." +
						" En este Ãºltimo caso el premio aparece una vez que el jugador haya destruido el objeto (sÃ³lo los robots militares pueden destruir objetos). " +
						" El jugador toma un premio cuando pasa por encima de Ã©l, los premios pueden ser nafta: aumenta en 50 unidades la cantidad actual de combustible del robot, " +
						"sin exceder su capacidad mÃ¡xima. - balas: Aumenta en 5 unidades la cantidad de balas disponibles del robot militar. En caso de no ser robot militar," +
						" no se obtienen beneficios al recolectar este elemento.- puntos: aumenta en 100 unidades el puntaje del robot." +
						" los objetos que puede encontrar el robot en su camino pueden ser destruibles(cajas, plantas y paredes) o indestructibles (concreto) " +
						"Los robots militares pueden dispararles a los objetos destruibles que soportan estas cantidad de disparos:  Pared = 5 Planta = 1 Caja = 3"+
						" Para manejar el robot se utilizan los siguientes comandos:  FLECHA ARRIBA: camina, FLECHA ABAJO: extiende el brazo del robot para juntar el objeto, FLECHA DERECHA: gira el robot hacia la derecha," +
						"FLECHA IZQUIERDA: gira el robot hacia la izquierda. R: si tiene el brazo extendido junta el objeto, ENTER: Entra al menu de opciones, BARRA ESPACIADORA:" +
						" Realiza el disparo (Robot Militar). En el juego va a ver un panel donde se podra ver el puntaje obtenido hasta el momento como asi tambien el combustible" +
						"disponible como la cantidad de balas que le quedan si es un robot militar y ademas el ultimo objeto recolectado. Tambien presenta el BOTON REINICIAR: para poder" +
						"reiniciar el nivel, BOTON TERMINAR: Para terminar el nivel y comenzar uno nuevo si quiere, BOTON BLANCO para cambiar el color de pincel a blanco y BOTON NEGRO: " +
						"para cambiar el color de pincel a negro" +
						" Al iniciar el juego tendremos que elegir el nivel que queremos jugar como asi tambien con que robot queremos hacerlo." +
						"",23,71);
				 

			    textArea.setLineWrap ( true ); 
			    textArea.setEditable ( true ); 
			    textArea.setVisible ( true );
			   
			   MostrarAyuda.add(textArea);
			    MenuAyuda.setVisible(true);
			    MenuAyuda.getContentPane().add(MostrarAyuda);
			
		
		}});	
	}
		

	
	

	
/**
 * Retorna el panel con la imagen del tablero	
 * @return panel con imagen del tablero
 */
  public JPanel getContenedor(){
	return panel;
  }
  
  
  /**
   * Reinicia el nivel que se esta jugando
   */
  public void reiniciar() {
	
 
  
	   controlador = new Controlador (this);


	  if (esMilitar){
		  myRobot = new Militar();
	  }else {
		  myRobot = new Civil();
	  }
		t= new Tablero(myRobot);

	  j= new Jugador (0,t);
	  myRobot.setTablero(t);
	  j.setRobot(myRobot);
	  initGUI2();

	  archivo= new ClaseArchivo(ruta);


      iniciarJuego(myRobot);

	  actualizarValores();
	  controlador.run();


  }


  

	
	/**
	 * Retorna el menu de inicio
	 * @return menu de inicio del juego
	 */

	public JFrame getMenu(){
		return Menu;}
	
	
/**
 * Retorna un mapeo de Strings en ImageIcons
 * @return mapeo de string en ImageIcons
 */
public Map<String, ImageIcon[]> getMapeo() {
	return mapeo;
}


/**
 * Carga las imagenes en el mapeo, donde quedaran guardadas.
 */

public void asignarImagenes() {
	
	

	ImageIcon objetos[] = new ImageIcon[9];
	objetos[0]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Robot/caja.png"));
	objetos[1]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Robot/llegada.png"));
	objetos[2]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Robot/planta.png"));
	objetos[3]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Robot/pared.png"));
	objetos[4]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/conoA.png"));
	objetos[5] = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/conoAsf.png"));
	objetos[6]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Robot/concreto.png"));
	objetos[7]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/bar.png"));
	objetos[8]= new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/bas.png"));

	ImageIcon premios[] = new ImageIcon[6];
	
	premios[0]=new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/var.png"));
	premios[1]=new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/vas.png"));
	premios[2]=new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/puntosArena.png"));
	premios[3]=new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/puntosAsfalto.png"));
	premios[4]=new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/car.png"));
	premios[5]=new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/cas.png"));
	
	ImageIcon pisos[] = new ImageIcon[7];
	pisos[0] = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/arena.png"));
	pisos[1] = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/asfalto.png"));
	pisos[2] = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/fuego.png"));
	pisos[3] = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/agua.png"));
	pisos[4] = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Robot/star.png"));
	pisos[5] =new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/pnegro.png"));
	pisos[6] =new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Piso/pblanco.png"));
	


	try {
		mapeo.put("objetos",objetos);
		mapeo.put("pisos", pisos);
		mapeo.put("premios", premios);
		
		
	} catch (InvalidKeyException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
}

public Jugador getJugador(){
	return j;
}




private class Oyente implements MouseListener{

	private GUI h;
	
	public Oyente(GUI he){
		h=he;
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		//se crea el juego y muestra el menu
		//tambien se crea el robot
		
		if ((ruta!=null)&& (archivo.GetCargue())){
			 String [] botones = { " Civil", " Militar" };
			 int i=JOptionPane.showOptionDialog (null, " ¿Con que robot desea jugar?", "Tipo de robot", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, botones,null);
			 int x=j.getRobot().getPosX();
			 int y=j.getRobot().getPosY();
			 
			 
			 if (i== JOptionPane.YES_OPTION) {
				 	Menu.setVisible(false);
				 	h.setVisible(true);
				 	esMilitar=false;
				 	myRobot=new Civil();
				 	j.setRobot(myRobot);
				
			 }
			 else if (i==JOptionPane.NO_OPTION) {
				 Menu.setVisible(false);
			     h.setVisible(true);
			     esMilitar=true;
			     myRobot = new Militar();
			     j.setRobot(myRobot);
			  
			      }
			 	
			 		t.setRobot(myRobot);

					j.getRobot().setPosX(x);
					j.getRobot().setPosY(y);
				
				//myRobot=j.getRobot();
				UltPremio.setText("Ultimo premio");
				UltPremio.setFont(new java.awt.Font("Tahoma", 1, 13));
				UltPremio.setForeground(new java.awt.Color(253, 53, 0));
				actualizarValores();
				
				int b=0;
				if (esMilitar){
					b=((Militar)j.getRobot()).getBalas();
				}
				Balas.setText("Balas: "+b);
				// myRobot=j.getRobot();
				controlador.run();

		
		}
	
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}

/**
 *  Actualiza los datos del robot que se muestran en pantalla-
 */

public void actualizarValores(){
	Combustible.setText("Combustible:"+j.getRobot().getCombustible());
	Puntaje.setText("Puntaje: "+j.getRobot().getPuntajeNivel());
	if (esMilitar) Balas.setText("Balas: "+((Militar) j.getRobot()).getBalas());
	
	Coleccionable o= j.getRobot().getBaul().getTop();
	if (o== null) {
		Premio.setText(" "+" Tope vacio");
	}
	else if (o.esvalisa)
			Premio.setText("Baliza");
			else Premio.setText(" Cono");

}


private class OyenteClose implements MouseListener{

	@SuppressWarnings("unused")
	private GUI h;
	
	public OyenteClose(GUI he){
		h=he;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		System.exit(0);
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	
}





/**
 * Avanza 10 pixeles
 */

public void avanzar(){
	

	
	if (j.getRobot().getCombustible()<=0)
		mostrarGameOver();	
	
	pintar();

	
	Rectangle r = puedeAvanzar();
	if ((r==null)&&(j.getRobot().getCombustible()>0)){
		AnteriorY=j.getRobot().getPosY();
		AnteriorX= j.getRobot().getPosX();
	
		switch (horizonte){
		case	0: { //arriba
			if (j.getRobot().getPosY()>0)
				{
				
				j.getRobot().setPosY(j.getRobot().getPosY()-50);

				controlador.actualizar();
				}
			break;
			}
	
		case 1 : {//derecha
		if (j.getRobot().getPosX()<=840) //anda joya con 900
			{ 
			j.getRobot().setPosX(j.getRobot().getPosX()+50);

			controlador.actualizar();
			}
		break;

		}
	
		case 2: {//abajo
			if (j.getRobot().getPosY()<650)
				{
				j.getRobot().setPosY(j.getRobot().getPosY()+50);

				controlador.actualizar();
				
				}
				break;

			}
	
		case 3: {// izquierda
			if (j.getRobot().getPosX()>0)
				{
				j.getRobot().setPosX(j.getRobot().getPosX()-50);


				controlador.actualizar();
				}
			break;

			}
		}

		

	}else if (llegada.getBounds().intersects(r)){
				mostrarFinal();
			}else reajusto();
	
	
	
	if (puedeAvanzar()!=null) {
		 if (llegada.getBounds().intersects(puedeAvanzar())){
				mostrarFinal();
			}else reajusto();
		reajusto();
	}
	j.getRobot().getBrazo().moverBrazo();

	if (AnteriorX!=j.getRobot().getPosX())
		j.getRobot().consumirComb();
	else if (AnteriorY!=j.getRobot().getPosY())
			j.getRobot().consumirComb();

		
	
	actualizarValores();
	
	
	}

	
/**
 * 
 * @param o objeto contra el que choco
 */
	private void reajusto() {
		
		
		j.getRobot().setPosX(AnteriorX);
		j.getRobot().setPosY(AnteriorY);
		//j.getRobot().setCombustible(j.getRobot().getCombustible()+1);
		controlador.actualizar();
	}
	
	

	/**
	 * Gira el robot 90Â° hacia la izquierda
	 * horizonte=0 hacia arriba.
	 * horizonte=1 derecha
	 * horizonte = 2 hacia abajo
	 * horizonte = 3 hacia izquiera
	 * 
	 */

	private void girarIzq(){
		

		if (j.getRobot().getCombustible()<=0)
			mostrarGameOver();	
		
		
		j.getRobot().consumirComb();
		actualizarValores();
		
		if (j.getRobot().getCombustible()==0)
			mostrarGameOver();
		switch (horizonte){
		
		case 0:
		{
			j.getRobot().getRepresentacionG().setIzq();
			controlador.actualizar();
			horizonte=3;
			break;
		}
		
		case 1:
		{
			j.getRobot().getRepresentacionG().setArriba();
			controlador.actualizar();
			horizonte=0;
			break;
		}
		
		case 2:
		{
			j.getRobot().getRepresentacionG().setDer();
			controlador.actualizar();
			horizonte=1;
			break;
		}
		
		case 3:
		{
			j.getRobot().getRepresentacionG().setAbajo();
			controlador.actualizar();
			horizonte=2;
			break;
		}
	}
	j.getRobot().setHorizonte(horizonte);
	j.getRobot().getBrazo().setHorizonte(horizonte);
	

}
	/**
	 * 	 * Gira el robot 90Â° hacia derecha
	 */
	
	private void girarDer(){

		
		if (j.getRobot().getCombustible()<=0)
			mostrarGameOver();
		j.getRobot().consumirComb();

		switch (horizonte){
		case 0:
		
		{
			j.getRobot().getRepresentacionG().setDer();
			controlador.actualizar();
			horizonte=1;
			break;
		}
		
		case 1:
		{
			j.getRobot().getRepresentacionG().setAbajo();
			controlador.actualizar();
			horizonte=2;
			break;
		}
		
		case 2:
		{
			j.getRobot().getRepresentacionG().setIzq();
			controlador.actualizar();
			horizonte=3; 
			break;
		}
		
		case 3:
		{
			j.getRobot().getRepresentacionG().setArriba();
			controlador.actualizar();
			horizonte=0;
			break;
		}

	}
		j.getRobot().setHorizonte(horizonte);
		j.getRobot().getBrazo().setHorizonte(horizonte);
		actualizarValores();



}
	
	
		
		
public void setControlador(Controlador con) {
			controlador=con;
			
}

private class Keyboard {
	
	public Keyboard() {
		KeyListener listener = new MyKeyListener();
		addKeyListener(listener);
		setFocusable(true);
		}
	
}

	
private class MyKeyListener implements KeyListener {
	
	@Override
	public void keyPressed(KeyEvent e) {
		
		int key = e.getKeyCode();
		
		
		if (key==KeyEvent.VK_SPACE)
		{
			if (esMilitar)
			{
			
				((Militar)j.getRobot()).disparar(j.getTablero().getDestruibles());
				Balas.setText("Balas: "+((Militar)j.getRobot()).getBalas());
				
			}
			
		}
		if (key==KeyEvent.VK_DOWN)
		{
						
			j.getRobot().getBrazo().actiDesac();
			controlador.actualizar();
		}
		
		if (key==KeyEvent.VK_D) //deposita
		{

			depositar();
		}

		if (key==KeyEvent.VK_R) //presiono R
		{
			String s;
			// si hay coleccionable lo recolecto
			Coleccionable c = puedeRecolectar();
			
			
			if (c!=null)
			{
				if (c.esvalisa){s="Baliza";}
				else s= "Cono";
				Premio.setText(" "+ s);
				
				if (!j.getRobot().getBaul().estaLleno())
				
					 
				{
					j.getRobot().getBaul().insertar(c);
					((Transitable)c.getUbicacion()).setColeccionable(null);
					c.getRG().setVisible(false);
					c.getUbicacion().getRG().setVisible(true);
					try {
						j.getTablero().getObjetosColeccionables().remove(c.getPosition());
					} catch (InvalidPositionException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					
				}else System.out.println("baul lleno");
			
			}
			controlador.actualizar();

					

		}
		
		

		if (key==KeyEvent.VK_RIGHT){
				girarDer();
			}
		
		if (key==KeyEvent.VK_UP)
			avanzar();
		
		if (key==KeyEvent.VK_LEFT){
				girarIzq();
		}
		
		
		
		if (key==KeyEvent.VK_B)
		{
			botonBlanco();

		}
		
		if (key==KeyEvent.VK_N)
		{
			botonNegro();

		}
		
	
			
	
	}
		
		@Override
		public void keyReleased(KeyEvent e) {
					
		}

		@Override
		public void keyTyped(KeyEvent e) {

		}
	}

	protected void setLLegada(Premio p){
		llegada=p;
	}
	
	
	protected Transitable puedeDepositar(){
		
		Transitable toRet =null;
		
			for (Transitable tt: t.getPisosTrans()){
				if (j.getRobot().getBrazo().collision(tt)){
					toRet= tt;
					break;
				}
			}
			if (toRet!=null){
				if (toRet.getColeccionable()!=null)
					 toRet=null;
			}
			
			
			for (Destruible d: t.getDestruibles()){
				if ((j.getRobot().getBrazo().collision(d))){
					toRet=null;
					break;
				}
			}
			
			
		
		
		return toRet;
		
	}
	

	protected Coleccionable puedeRecolectar(){
		
		if (j.getRobot().getBrazo().activado())
		for (Coleccionable o:j.getTablero().getObjetosColeccionables()){
			
			if (j.getRobot().collisionBrazo(o)) 
			{
				return o;
			}
		}
		return null;
	}
	
	protected void pintar(){
		

		if (j.getRobot().getPincel().getActivado()){
			for (Transitable ttt: t.getPisosTrans()){

				if (j.getRobot().collision(ttt)) 
				{
					if (j.getRobot().getPincel().getColor())
						ttt.getRG().setBlanco();
					else ttt.getRG().setNegro();
				}
			}
		}
	}
	
		
	protected Rectangle puedeAvanzar(){
		
		
		Rectangle toReturn = null;
	
		for (Objeto o:j.getTablero().getObjetos()){
			if (j.getRobot().collision(o)) 
			{
				
				return o.getBounds();
			}
		}
		for (Coleccionable o:j.getTablero().getObjetosColeccionables()){
			if (j.getRobot().collision(o)) 
			{
				
				return o.getBounds();
			}
		}
		for (Destruible o:j.getTablero().getDestruibles()){
			if (j.getRobot().collision(o)) 
			{
				
				return o.getBounds();
			}
		}
		
		for (Piso p :j.getTablero().getPisos()){
			if (j.getRobot().collision((NoTransitable)p))
				return ((NoTransitable)p).getBounds();
		}
		
	
		
		
		 for (Premio p:j.getTablero().getPremios()){
             if (j.getRobot().collision(p))
             {
                     switch (p.getTipo()){
                     case 0: { //balas
                             if (esMilitar){
                                     ((Militar)j.getRobot()).setBalas(((Militar)j.getRobot()).getBalas()+10);
                             }
                             break;

                     }
                     case 1: {
                    	 j.getRobot().setPuntaje(j.getRobot().getPuntajeNivel()+10);
                    	 break;
                     }
                     case 2: {
                    	 j.getRobot().setCombustible(j.getRobot().getCombustible()+20);
                    	 break;
                     }
                     }
                     p.getRG().setVisible(false);
                     p.getUbicacion().getRG().setVisible(true);
                     j.getTablero().removePremio(p);
                     break;
              }
     }
		
		return toReturn;
	}
	
	 
	@SuppressWarnings("deprecation")
	protected void mostrarFinal(){
		int p= j.getRobot().getPuntajeNivel();
			 String [] botones = { "Reiniciar", "Cargar nivel nuevo" };
			 int i=JOptionPane.showOptionDialog (null, " Termino el nivel, su puntaje es: "+ p+" Que desea hacer?", "Tipo de robot", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, botones,null);
			 if (i== JOptionPane.YES_OPTION) {
				 reiniciar();
				 panel.requestDefaultFocus();
			 }
			 else if (i==JOptionPane.NO_OPTION) {
				 
				 			this.setVisible(false);
				 			new Juego();}
	}
	
	protected void mostrarGameOver(){
		{
			int ax = JOptionPane.showConfirmDialog(this, "No hay mas combustible, ¿ Jugar de nuevo?", "Confirmar salida", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);//pregunto si quiere jugar de nuevo
				if(ax == JOptionPane.YES_OPTION) 
				{
					this.setVisible(false);	
					new Juego();
					}
					else if(ax == JOptionPane.NO_OPTION)
								System.exit(0);
			
			} 
	}
	
	
	
	public void depositar(){
		
		if (!j.getRobot().getBaul().isEmpty())
		{

			Transitable tt = puedeDepositar();	
			if (tt!=null){
				j.getRobot().getBaul().getTop().setX(tt.getPosX());
				j.getRobot().getBaul().getTop().setY(tt.getPosY());
				tt.setColeccionable (j.getRobot().getBaul().getTop());
				j.getRobot().getBaul().getTop().setUbicacion(tt);
				tt.getColeccionable().getRG().setLocation(tt.getPosX(),tt.getPosY());
				j.getRobot().getBaul().removerTope();
				j.getTablero().agregarColeccionable(tt.getColeccionable());

			}
		

			
		}
		controlador.actualizar();
	}
	
	public void botonBlanco(){
		if (!j.getRobot().getPincel().getActivado()){
			j.getRobot().getPincel().setActivado(true);
		
	} else 	{
		if (j.getRobot().getPincel().getColor())

			j.getRobot().getPincel().setActivado(false);

	}
	j.getRobot().getPincel().setColor(true);

	}
	
	public void botonNegro(){
		if (!j.getRobot().getPincel().getActivado()){
			j.getRobot().getPincel().setActivado(true);
		} else 	{
			if (!j.getRobot().getPincel().getColor())

				j.getRobot().getPincel().setActivado(false);

		}
		j.getRobot().getPincel().setColor(false);
		
	}
}